//
//  HMOAuthViewController.swift
//  Weibo24
//
//  Created by apple on 17/3/27.
//  Copyright © 2017年 itheima. All rights reserved.
//

import UIKit
import SVProgressHUD

//  微博的AppKey
let AppKey = "2934576200"
//  微博的AppSecret
let AppSecret = "bf69eea31bf8776f3ce27e23c0f2d24d"
//  授权回调页地址
let Redirect_Uri = "http://www.itcast.cn"

//  微博登录控制器
class HMOAuthViewController: UIViewController {

    //  MARK: ---懒加载
    private lazy var webView: UIWebView = UIWebView()
    //  目的: 自定义视图控制器的视图
    override func loadView() {
        //  设置webView代理
        webView.delegate = self
        view = webView
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.white
        setupNavUI()
        requestOAuth()
    }
    
    //  加载微博登录界面
    private func requestOAuth() {
        //  请求地址
        let urlStr = "https://api.weibo.com/oauth2/authorize?client_id=\(AppKey)&redirect_uri=\(Redirect_Uri)"
        print(urlStr)
        //  创建请求对象
        let urlRequest = URLRequest(url: URL(string: urlStr)!)
        //  加载web页面
        webView.loadRequest(urlRequest)
        
        
    }
    
    
    
    //  设置导航栏按钮和标题
    private func setupNavUI() {
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "取消", target: self, action: #selector(cancelAction))
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "自动填充", target: self, action: #selector(autoFillAction))
        navigationItem.title = "微博登录"
    }
    
    //  MARK: ---导航栏按钮点击事件处理
    @objc private func cancelAction() {
    
        dismiss(animated: true, completion: nil)
    }
    
    @objc private func autoFillAction() {
        webView.stringByEvaluatingJavaScript(from: "document.getElementById('userId').value = 'hao123guohaibin@163.com';document.getElementById('passwd').value = 'guohaibin123';")
    }
//    //   把网络请求, 获取acccessToken逻辑处理,抽取到ViweModel中
//    //  通过code获取accesstoken
//    //  private 表示只能在类内部使用,fileprivate表示也是私有,但是可以在extension里面,但是都不能在外界访问这个方法
//    fileprivate func requestAccessToken(code: String) {
//        
//        HMNetworkTools.sharedTools.requestAccessToken(code: code) { (response, error) in
//            if error != nil {
//                print("网络请求异常: \(error!)")
//                return
//            }
//            
//            guard let dic = response as? [String: Any] else {
//                print("服务端数据格式不对")
//                return
//            }
//            //  代码执行到此表示oc对象(字典或者数组)
//            print(dic)
//            let userAccount = HMUserAccount(dic: dic)
//            //  通过uid 和 accesstoken获取用户数据
//            self.requesUserInfo(userAccount: userAccount)
//        }
//        
//        
//    }
//    
//    //  通过accessToken和uid获取用户信息
//    fileprivate func requesUserInfo(userAccount: HMUserAccount) {
//        //  获取令牌
//        let accessToken = userAccount.access_token!
//        //  用户id
//        let uid = userAccount.uid
//        HMNetworkTools.sharedTools.requestUserInfo(accessToken: accessToken, uid: uid) { (response, error) in
//            if error != nil {
//                print("网络请求异常: \(error!)")
//                return
//            }
//            
//            guard let dic = response as? [String: Any] else {
//                print("服务端数据格式不对")
//                return
//            }
//            
//            //  代码执行到此字典一定有值
//            print(dic)
//            
//            //  给对象里面的name和头像赋值
//            let name = dic["name"] as? String
//            let avatar_large = dic["avatar_large"] as? String
//            userAccount.name = name
//            userAccount.avatar_large = avatar_large
//            
//            //  保存用户对象
//            userAccount.saveUserAccount()
//        }
//        
//    }
  

}

//  MARK: ---UIWebViewDelegate 实现代理方法
extension HMOAuthViewController: UIWebViewDelegate {
    
    //  将要加载网络请求
    func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        //  获取请求地址
        guard let urlStr = request.url?.absoluteString else {
            //  如果请求地址是nil,不需要进行加载
            return false
        }
        
        //  代码执行到此表示urlStr一定有值
        if !urlStr.hasPrefix(Redirect_Uri) {
            //  不是我们关心的授权回调地址
            return true
        }
        //  代码执行到此表示是我们关心的回调地址, query表示请求的参数
        if let query = request.url?.query, query.hasPrefix("code=") {
            print(query)
            //  截取授权码(code)
            let code = query.substring(from: "code=".endIndex)
            //  通过code获取accessToken
//            requestAccessToken(code: code)
            //  通过viewmode实例调用获取accessToken
            HMUserAccountViewModel.sharedViewModel.requestAccessToken(code: code, callBack: { (isSuccess) in
                if isSuccess {
                    print("登录成功")
                    //  进入欢迎界面
                    //  先把当前OAuth控制dismis
                    self.dismiss(animated: false, completion: {
                        //  需要等到dismis操作完成以后再去发送切换根视图控制器的通知,否则会有内存泄漏
                        //  发送切换根视图的通知
                        NotificationCenter.default.post(name: NSNotification.Name(SwitchRootVCNotification), object: self)
                    })
                    
                } else {
                    print("登录失败")
                }
            })
            
        } else {
            //  点击是取消授权
            dismiss(animated: true, completion: nil)
        }
        
        print(urlStr)
        //  不加载授权回调地址和取消授权回调地址
        return false
        
    }
    
    //  已经开始加载
    func webViewDidStartLoad(_ webView: UIWebView) {
        //  显示等待指示视图
        SVProgressHUD.show()
    }
    //  加载完成
    func webViewDidFinishLoad(_ webView: UIWebView) {
        //  移除等待指示视图
        SVProgressHUD.dismiss()
    }
    //  加载失败
    func webView(_ webView: UIWebView, didFailLoadWithError error: Error) {
        //  移除等待指示视图
        SVProgressHUD.dismiss()
    }
    
}









